package com.example.weixin_01.test.design_model.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/10 20:38
 * jdk动态代理，必须实现InvocationHandler这个接口，然后获取到一个jdk动态代理类
 * 主要是为了调用目标方法，实现功能增强
 */
public class ProxyInvocationHandler implements InvocationHandler {

    //目标对象
    private Object target = null;

    //外部实例化时需要传入这个目标对象
    //传入的是谁就给谁创建动态代理

    public ProxyInvocationHandler(Object target){
        this.target = target;
    }

    /**
     * 这个方法就是代理类里面的代理方法
     * @param proxy :代理类,需要外部手动传入需要代理的类
     * @param method ： 目标方法,可能一个类里面会有多个方法
     * @param args ： 目标方法参数，对应目标方法里面的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object object = null;

        //目标方法执行
        //第一个是目标对象，第二个是目标参数
        //这个目标对象是一个动态的，因此需要外面传入
        object = method.invoke(target,args);

        //在获取到这个目标方法之后，可以对这个目标方法进行一个增强功能
        if (object != null){
            //外部传入这个sell的这个方法，那么执行这个方法的返回值类型为Double
            Double price = (Double)object;
            //手机店获取利润，功能增强
            price = price + price* 0.2;
            object = price;
        }

        return object;
    }
}
